﻿#include<iostream>
#include<map>
#include<set>
#include<vector>
#include<string>
using namespace std;

//class A
//{
//public:
//	void f() 
//	{ 
//		cout << "A::f()" << endl; 
//	}
//	int a;
//};
//
//class B : public A
//{
//public:
//	void f(int a) 
//	{ 
//		cout << "B::f()" << endl; 
//	}
//	int a;
//};
//
//int main()
//{
//	B b;
//	b.f();
//	return 0;
//}

//class A
//{
//public:
//    virtual void f()
//    {
//        cout << "A::f()" << endl;
//    }
//};
//
//
//class B : public A
//{
//private:
//    virtual void f()
//    {
//        cout << "B::f()" << endl;
//    }
//};
//
//int main()
//{
//    A* pa = (A*)new B;
//
//    pa->f();
//}

//class A
//{
//public:
//    A() :m_iVal(0) { test(); }
//    virtual void func() { std::cout << m_iVal <<' '; }
//    void test() { func(); }
//public:
//    int m_iVal;
//};
//
//class B : public A
//{
//public:
//    B() { test(); }
//    virtual void func()
//    {
//        ++m_iVal;
//        std::cout << m_iVal << ' ';
//    }
//};
//
//int main(int argc, char* argv[])
//{
//    A* p = new B;
//    p->test();
//    return 0;
//}

//class Base
//{
//public:
//	virtual void Func1()
//	{
//		cout << "Base::Func1()" << endl;
//	}
//
//	virtual void Func2()
//	{
//		cout << "Base::Func2()" << endl;
//	}
//
//	void Func3()
//	{
//		cout << "Base::Func3()" << endl;
//	}
//private:
//	int _b = 1;
//};
//
//class Derive : public Base
//{
//public:
//	virtual void Func1()
//	{
//		cout << "Derive::Func1()" << endl;
//	}
//
//	virtual void Func3()
//	{
//		cout << "Derive::Func3()" << endl;
//	}
//
//private:
//	int _d = 2;
//};
//
//int main()
//{
//	Base b;
//	Derive d;
//
//	return 0;
//}

//int TestSet()
//{
//	int array[] = { 2, 1, 3, 9, 6, 0, 5, 8, 4, 7 ,2,2,2,2 };
//	// 注意：multiset在底层实际存储的是<int, int>的键值对
//	set<int> s(array, array + sizeof(array) / sizeof(array[0]));
//	for (auto& e : s)
//		cout << e << " ";
//	cout << endl;
//
//	return 0;
//}
//
//int main()
//{
//	TestSet();
//}

#include<functional>
#include<algorithm>
//前K个高频单词
//https://leetcode.cn/problems/top-k-frequent-words/description/

//class Solution {
//public:
//    struct KVcmp
//    {
//        bool operator()(const pair<string,int>& kv1,const pair<string,int>& kv2)
//        {
//            return kv1.second > kv2.second;
//        }
//    };
//
//    vector<string> topKFrequent(vector<string>& words, int k)
//    {
//        map<string, int> countmap;
//        for(auto& e:words)
//        {
//            countmap[e]++;
//        }
//
//        vector<pair<string, int>> vp(countmap.begin(), countmap.end());
//        //归并排序（保持字典序，通过second进行比较）
//        stable_sort(vp.begin(), vp.end(), KVcmp());
//        
//        vector<string> ret;
//        auto it = vp.begin();
//        while (k--)
//        {
//            ret.push_back(it->first);
//            it++;
//        }
//
//        return ret;
//    }
//};


//349. 两个数组的交集
//https://leetcode.cn/problems/intersection-of-two-arrays/

//class Solution {
//public:
//    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) 
//    {
//        set<int>s1(nums1.begin(), nums1.end());
//        set<int>s2(nums2.begin(), nums2.end());
//
//        auto it1 = s1.begin();
//        auto it2 = s2.begin();
//
//        vector<int> ret;
//        while (it1 != s1.end() && it2 != s2.end())
//        {
//            if (*it1 < *it2)
//                it1++;
//            else if (*it1 > *it2)
//                it2++;
//            else
//            {
//                ret.push_back(*it1);
//                it1++;
//                it2++;
//            }
//        }
//        
//        return ret;
//    }
//};


